package com.atguigu.bigdata.scala.chapter11

object Scala03_Generic {

    def main(args: Array[String]): Unit = {
        // TODO - 泛型 - scala
        // scala中的泛型和java中的泛型基本类似
        // java 采用尖括号表示泛型，scala中采用中括号表示泛型

        // TODO scala中的泛型也是不可变的
        // 泛型和类型不一样的，所以无需考虑父子关系
        // 马丁想：让泛型和类型当成整体来使用
        // 马丁在语法中，对泛型进行变化
        // TODO 协变 ：在泛型的前面增加 符号： +
        //     如果泛型Child是泛型User的子类型，那么将Test[Child]也当成Test[User]的子类型来使用
        // TODO 逆变 ：在泛型的前面增加 符号： -
        //     如果泛型Parent是泛型User的父类型，那么将Test[Parent]也当成Test[User]的子类型来使用

        // 泛型其实在编译后是不存在。主要是用于在编译器中进行操作
        // 泛型主要用于编译时语法约束，不用于运行阶段的语法约束。
        val t1 : Test[User] = new Test[User]()
        val t2 : Test[User] = new Test[Parent]()//Test[-T]
        //val t3 : Test[User] = new Test[Child]()//Test[+T]
        //泛型相同时考虑父子类
        val t4 : Test[User] = new SubTest[User]()
    }
    class Test[-T] {
    }
    class Parent {

    }
    class User extends Parent{

    }
    class Child extends User {

    }
    class SubTest[T] extends Test {

    }
}
